#include "LinkList.h"

//初始化链表
 LinkList* Init_LinkList() {
    LinkList* list = (LinkList*)malloc(sizeof(LinkList));
    list->size = 0;
    //头节点，不保存数据信息
    list->head = (LinkNode*)malloc(sizeof(LinkNode));
    list->head->data = NULL;
    list->head->next = NULL;
    return list;
}

//插入
void Insert_LinkList(LinkList* list, int pos,void* data) {
    if(list == NULL) return;
    if(data == NULL) return;

    //将用户的从1开始排序，转换成为程序员理解的从0开始排序
    pos = pos - 1;

    if(pos < 0 || pos > list->size) return;

    //创建新的结点
    LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
    newNode->data = data;
    newNode->next = NULL;

    //找结点
    //辅助指针变量
    LinkNode* pCurrent = list->head;
    for(int i = 0; i < pos;i++) {
        pCurrent = pCurrent->next;
    }

    //新节点入链表
    newNode->next = pCurrent->next;
    pCurrent->next = newNode;

    list->size++;

}

//头插法建立单链表
LinkList* List_HeadInsert(int size) {
    //创建链表
    LinkList* list = Init_LinkList();
    //用户输入size个整数
    int x;
    scanf("%d\n",&x);
    LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));

    for(int i = 0;i < size;i++) {
        //初始化一个结点
        LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
        scanf("%d\n",&x);
        newNode->data = &x;
        newNode->next = list->head->next;
        list->head->next = newNode;
        list->size++;
    }
    return list;
}

//尾插法
LinkList* List_TailInsert(int size) {
    //创建链表
    LinkList* list = Init_LinkList();
    //用户输入size个整数
    int x;
    scanf("%d\n",&x);
    LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));

    //找结点
    //辅助指针变量
    LinkNode* pCurrent = list->head;
    for(int i = 0; i < size;i++) {
        pCurrent = pCurrent->next;
    }

    for(int i = 0;i < size;i++) {
        //初始化一个结点
        LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
        scanf("%d\n",&x);
        newNode->data = &x;
        newNode->next = NULL;

        //遍历完后，辅助指针就指向的是最后一个结点
        pCurrent->next = newNode;
        pCurrent = pCurrent->next;
        list->size++;
    }
    return list;
}

//按序号查找
LinkNode* getElem(LinkList* list,int pos) {
    if(list == NULL) return NULL;
    if(pos == 0) return list->head;
    if(pos < 1 || pos > list->size) return NULL;

    //找结点
    //辅助指针变量
    LinkNode* pCurrent = list->head->next;
    //遍历查找
    for(int i = 0; i < pos - 1;i++) {
        pCurrent = pCurrent->next;
    }
    return pCurrent;
}

//查找
int Find_LinkList(LinkList* list,void* data) {
    if(list == NULL) return -1;
    if(data == NULL) return -1;
    //定义辅助指针
    LinkNode* pCurrent = list->head->next;
    for(int i = 1;i <= list->size;i++) {
        if(pCurrent->data == data) {
            return i;
        }
        pCurrent = pCurrent->next;
    }
    return -1;
}

//删除指定位置的值
void RemoveByPos_LinkList(LinkList* list,int pos) {
    if(list == NULL) return;
    if(pos < 1 || pos > list->size) return;

    //找结点
    //辅助指针变量
    LinkNode* pCurrent = list->head;
    //指向前一个结点
    for(int i = 1; i < pos;i++) {
        pCurrent = pCurrent->next;
    }

    //缓存删除的结点
    LinkNode* pDel = pCurrent->next;
    pCurrent->next = pDel->next;
    //释放删除结点的内存
    free(pDel);

    list->size--;
}
//打印
void Print_LinkList(LinkList* list,PRINTLINKNODE print) {
    if(list == NULL) return;
    //定义辅助指针变量
    LinkNode* pCurrent = list->head->next;
    for(int i = 0;i < list->size;i++) {
        print(pCurrent->data);
        pCurrent = pCurrent->next;
    }
}

//释放链表内存
void FreeSpace_LinkList(LinkList* list) {
    if(list == NULL) return;
    //辅助指针变量
    LinkNode* pCurrent = list->head;

    for(int i = 0;i <= list->size;i++) {
        //缓存下一个结点
        LinkNode* pNext = pCurrent->next;
        free(pCurrent);
        pCurrent = pNext;
    }

    //释放链表内存
    list->size = 0;
    free(list);

}

//获得链表的长度
int Size_LinkList(LinkList* list) {
    if(list == NULL)return -1;
    return list->size;
}